#include "crc32.h"

//类静态变量初始化
CCRC32 *CCRC32::m_instance = NULL;

//构造函数
CCRC32::CCRC32()
{
	Init_CRC32_Table();
}

// 析构函数（在CGarhuishou局部类处理）
CCRC32::~CCRC32(){ }

// 位反转函数
unsigned int CCRC32::Reflect(unsigned int ref, char ch){
    unsigned int value(0);
    for(int i = 1; i < (ch + 1); i++)
	{
		if(ref & 1)
			value |= 1 << (ch - i);
		ref >>= 1;
	}
	return value;
}

// 初始化查找表
void CCRC32::Init_CRC32_Table(){
    // 定义标准CRC32多项式
    unsigned int ulPolynomial = 0x04c11db7;

    // 为所有可能的256个ASCII编码预先生成值
    for(int i = 0; i <= 0xFF; i++){
        // 将i的8位进行反转并左移24位
        crc32_table[i] = Reflect(i, 8) << 24;
        // CRC32算法核心：每一位进行模2运算
        for (int j = 0; j < 8; j++){
            crc32_table[i] = (crc32_table[i] << 1) ^ (crc32_table[i] & (1 << 31) ? ulPolynomial : 0);
        }
        // 对最终得到的32位值再进行反转
        crc32_table[i] = Reflect(crc32_table[i], 32);
    }
}

// 获取校验和函数
int CCRC32::Get_CRC(unsigned char* buffer, unsigned int dwSize){
    unsigned int  crc(0xffffffff);// 校验和初始值
	int len = dwSize;
    // 对每一位的
    while(len--) {
        crc = (crc >> 8) ^ crc32_table[(crc & 0xFF) ^ *buffer++];
    }
    // 最后取反得到校验和
    return crc^0xffffffff;
}
